package com.tom.redisapplication.localcache;

/**
 * 本地缓存接口
 * <p>
 * LocalCache主要由3个部分组成：数据缓存、数据超时时间、数据清理任务。
 * 数据缓存和数据超时时间都采用{@code ConcurrentHashMap}来存储数据，
 * 数据超时时间中Key为数据存储的键，value是数据的时间戳。
 * 数据清理任务采用{@code ScheduledThreadPoolExecutor}实现任务调度，默认的任务线程数为1，
 * 这样可以避免多线程带来的并发修改问题，同时线程都是内存操作，这样单线程同样具备高性能。
 * </p>
 * <p>
 * 每次项缓存中插入数据时，LocalCache首先会将数据插入到ConcurrentHashMap中。
 * 然后判断有没有设置超时时间，如果有超时时间，LocalCache会将失效时间插入到ConcurrentHashMap中，
 * 并创建数据清理任务，之后任务提交到ScheduledThreadPoolExecutor线程池中。
 * 每次从缓存中查询数据，LocalCache会直接从ConcurrentHashMap中读取数据。
 * </p>
 *
 * <p>
 * 定时任务线程池会按照超时时间来触发数据清理任务，数据清理任务会从数据时长的缓存池中获取Key对应的时间，
 * 判断当前Key对应的数据是否已经到期了。如果数据已经到期了
 * ，LocalCache会调用remove方法将数据从缓存池中移除。
 * </p>
 *
 * @author zx
 * @date 2024年12月25日 13:36
 */
public interface LocalCache<V> {
    /**
     * 向缓存中插入数据，数据永久有效
     *
     * @param key   缓存key
     * @param value 缓存值
     */
    boolean put(String key, V value);

    /**
     * 向缓存中插入数据，数据根据设定的时间生效，时间到期会从缓存中移出
     *
     * @param key     缓存key
     * @param value   缓存值
     * @param seconds 过期时间,单位为秒
     */
    boolean put(String key, V value, int seconds);

    /**
     * 判断缓存中是否包含对应的key
     *
     * @param key 缓存key
     * @return true 包含，false 不包含
     */
    Boolean containKey(String key);

    /**
     * 根据key从缓存中获取数据
     *
     * @param key 缓存key
     * @return 缓存值
     */
    V get(String key);

    /**
     * 移出缓存中对应key的数据
     *
     * @param key 缓存key
     */
    void remove(String key);

    /**
     * 关闭缓存池
     */
    void shutdownNow();
}
